package cashpointer.mobile;

import android.app.ListActivity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import cashpointer.mobile.dao.DaoModel.Owners;
import cashpointer.mobile.model.ExtendedCheckBox;
import cashpointer.mobile.model.ExtendedCheckBoxListAdapter;
import cashpointer.mobile.model.ExtendedCheckBoxListView;

public class OwnersActivity extends ListActivity {

	/**
	 * Opcje menu.
	 */
	static private final int MENU_QUIT = Menu.FIRST;
	static private final int MENU_SELECT_ALL = Menu.FIRST + 1;
	static private final int MENU_SELECT_NONE = Menu.FIRST + 2;
	static private final int MENU_SELECT_REVERSE = Menu.FIRST + 3;
	
	/**
     * The columns we are interested in from the database
     */	
	private static final String[] PROJECTION = new String[] {
    	Owners._ID, // 0
    	Owners.NAME, // 1
    	Owners.SELECTED, // 2
    };
	
	//private static String LOG_TAG = "OwnersActivity";
	
	// Adapter laczacy model z widokiem
	private ExtendedCheckBoxListAdapter listAdapter; 

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// Podpiecie layout'u
		setContentView(R.layout.owners);
		
		// Budowanie adaptera
		listAdapter = new ExtendedCheckBoxListAdapter(this);
		
		// Jesli nie ma zadnych danych w intent ustawiam provider dla owners
		Intent intent = getIntent();
		if (intent.getData() == null) {
			intent.setData(Owners.CONTENT_URI);
		}
		
		// Zbudowanie cursora i do pobrania danych
		Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null, Owners.DEFAULT_SORT_ORDER);
				
		// Przegladanie kursora
		if (cursor.moveToFirst()) {
	        Integer cursorId = null;
			String cursorName = null;
	        Short cursorSelected = null;
	        
	        int idColumn = cursor.getColumnIndex(Owners._ID);
	        int nameColumn = cursor.getColumnIndex(Owners.NAME);
	        int selectedColumn = cursor.getColumnIndex(Owners.SELECTED);
	        
	        do {
	        	// Pole "_ID"
				cursorId = cursor.getInt(idColumn);
				if (cursorId == null) {
					//Log.e(LOG_TAG, "Id jest null!");
				}
	        	
				// Pole "NAME"
				cursorName = cursor.getString(nameColumn);
				if (cursorName == null) {
					//Log.e(LOG_TAG, "Name jest null!");
				}
	    	  
				// Pole "SELECTED"
				boolean selected = false;
				cursorSelected = cursor.getShort(selectedColumn); // pobrane jako boolean
				if (cursorSelected != null) {
					selected = (cursorSelected == 1) ? true : false;
				} else {
					//Log.e(LOG_TAG, "Selected jest null!");
				}
	    	  
				// Dodaje nowy wiersz do listy
				if (cursorId != null && cursorName != null) {
					listAdapter.addItem(new ExtendedCheckBox(cursorId, cursorName, selected));
				}
	        } while (cursor.moveToNext());
	    }
		
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }

		// Podlaczenie adaptera do activity
		setListAdapter(listAdapter); 
	}

	/**
     * Funkcja budowania menu.
     */
    public boolean onCreateOptionsMenu(Menu menu) {
    	menu.add(0, MENU_SELECT_ALL, 0, getString(R.string.menu_select_all)).setIcon(R.drawable.menu_mark);
    	menu.add(1, MENU_SELECT_NONE, 0, getString(R.string.menu_select_none)).setIcon(R.drawable.menu_mark);
    	menu.add(3, MENU_SELECT_REVERSE, 0, getString(R.string.menu_select_reverse)).setIcon(R.drawable.menu_mark);
    	menu.add(4, MENU_QUIT, 0, getString(R.string.menu_exit)).setIcon(R.drawable.menu_close);
    	return true;
    }

    /**
     * Obsluga zdarzenia wybrania opcji z menu.
     */
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        	case MENU_QUIT: {
        		quit();
        		return true;
        	}
        	case MENU_SELECT_ALL: {
        		selectAll();
        		return true;
        	}
        	case MENU_SELECT_NONE: {
        		selectNone();
        		return true;
        	}
        	case MENU_SELECT_REVERSE: {
        		selectReverse();
        		return true;
        	}
        }
	    
        return false;
    }

	/**
     * Funkcja odznacza wszystkie sieci bankomatow
     */
    private void selectNone() {
    	// Odznaczenie wszystkich sieci w widoku
    	listAdapter.deselectAll();
    	
    	// Zakres zmian do wprowadzenia
		ContentValues values = new ContentValues();
        values.put(Owners.SELECTED, false);
        
        // Aktualizacja w bazie
        getApplicationContext().getContentResolver().update(Owners.CONTENT_URI, values, null, null);
	}

    /**
     * Funkcja zaznacza wszystkie sieci bankomatow
     */
	private void selectAll() {
    	// Zaznaczenie wszystkich sieci w widoku
    	listAdapter.selectAll();

    	// Zakres zmian do wprowadzenia
		ContentValues values = new ContentValues();
        values.put(Owners.SELECTED, true);
        
        // Aktualizacja w bazie
        getApplicationContext().getContentResolver().update(Owners.CONTENT_URI, values, null, null);
	}
    
	/**
	 * Funkcja odwracajaca zaznaczenie sieci bankomatow
	 */
    private void selectReverse() {
    	// Zaznaczenie wszystkich sieci w widoku
    	listAdapter.selectReverse();

    	// Zbudowanie cursora i do pobrania danych
		Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null, Owners.DEFAULT_SORT_ORDER);
				
		// Przegladanie kursora
		if (cursor.moveToFirst()) {
	        Integer cursorId = null;
	        Short cursorSelected = null;
	        
	        int idColumn = cursor.getColumnIndex(Owners._ID);
	        int selectedColumn = cursor.getColumnIndex(Owners.SELECTED);
	        
	        do {
	        	// Pole "_ID"
				cursorId = cursor.getInt(idColumn);
				if (cursorId == null) {
					Log.e("OwnersActivity", "Id jest null!");
				}
	        	
				// Pole "SELECTED"
				boolean selected = false;
				cursorSelected = cursor.getShort(selectedColumn); // pobrane jako boolean
				if (cursorSelected != null) {
					selected = (cursorSelected == 1) ? true : false;
				} else {
					Log.e("OwnersActivity", "Selected jest null!");
				}
	    	  
				// Adres do wybranego rekordu z bazy (o danym id)
		        Uri uri = ContentUris.withAppendedId(Owners.CONTENT_URI, cursorId);
				
				// Zakres zmian do wprowadzenia
				ContentValues values = new ContentValues();
		        values.put(Owners.SELECTED, !selected);
		        
		        // Aktualizacja
		        getApplicationContext().getContentResolver().update(uri, values, null, null);
				
	        } while (cursor.moveToNext());
	    }
		
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
	}

	/**
     * Obsluga zdarzenia wybrania pozycji z listy
     */
    protected void onListItemClick(ListView l, View view, int position, long id) {
    	if (view != null) {
    		ExtendedCheckBoxListView CurrentView = (ExtendedCheckBoxListView) view;
            if (CurrentView != null) {
         		CurrentView.toggleCheckBox();
         	}
        }
        
        super.onListItemClick(l, view, position, id);
    }

    /**
     * Funkcja konczenia aplikacji.
     */
    private void quit() {
    	this.finish();
    }
}
